home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
World of Video
/
World of Video.iso
/
datafiles
/
gfx_formats
/
anim
/
anim310.arc
/
IFFdump.c
< prev
next >
Wrap
C/C++ Source or Header
|
1987-06-12
|
8KB
|
344 lines
/*
* DECODE IFF formatted files V1.00
*
* COMPILE W/ASTARTUP.OBJ and MY.LIB
*
* iffdump [-vV] file
*
* -v : display a little more information (only for forms and types
* the program knows about)
* -V : display additional hex dump of all sections
*
*
* NOTE: The '-v' flag could use *a lot* of expansion... Since I haven't
* got the latest IFF documentation.
*
*
* NOTE: This program does almost no format checking (e.g. PROP's only
* within LIST's, etc...), it is meant to display the format of
* valid IFF files.
*/
#include "iffdump.h"
#include <graphics/view.h>
#include "stdio.h"
#include "functions.h"
#define MODE_V1 0x01
#define MODE_V2 0x02
extern char *tabstr(), *ltos();
union {
X_ANHD anhd;
X_BMHD bmhd;
X_CMAP cmap[64];
X_GRAB grab;
X_DEST dest;
X_SPRT sprt;
X_CAMG camg;
X_CRNG crng;
} U;
int Modes;
main(ac, av)
char *av[];
{
int i, j;
char *str;
FILE *fi;
long endpos;
for (j = 0, i = 1; i < ac; ++i) {
str = av[i];
if (*str == '-') {
while (*++str) {
switch(*str) {
case 'v':
Modes |= MODE_V1;
break;
case 'V':
Modes |= MODE_V2;
break;
default:
printf ("'%lc' bad option\n", *str);
}
}
} else {
if (j) {
puts("May specify only one file");
exit(1);
}
j = i;
}
}
if (j == 0) {
puts ("IFFDUMP [-vV] file");
puts ("(c)1986 Matthew Dillon. Public Domain V1.00");
puts ("");
puts ("-v show detail on things the prog. knows about");
puts ("-V show hex dump");
exit(1);
}
fi = fopen(av[j],"r");
if (fi == NULL) {
puts ("could not open file");
exit(1L);
}
fseek(fi, 0L, 2);
endpos = ftell(fi);
fseek(fi, 0L, 0);
#if 0
printf("file end: %ld\n",endpos);
#endif
iffdecode(fi, 0L, endpos);
fclose(fi);
}
iffdecode(fi, tab, endpos)
FILE *fi;
long tab;
long endpos;
{
long chunk[2];
long curpos, bytes, curend;
long data;
char ok;
char count = 0;
#if 0
printf("call iffdecode: %ld %ld\n",tab,endpos);
#endif
for (;;) {
curpos = ftell(fi);
#if 0
printf("curpos: %ld\n",curpos);
#endif
if (curpos == endpos)
return(1);
if (count++ && tab == 0) {
puts ("Warning: Garbage after IFF-EOF");
return (0);
}
if (curpos + 8 > endpos) {
puts ("Error: Premature End Of File in header");
return(0);
}
fread(chunk,1,8,fi);
curpos += 8;
bytes = chunk[1];
curend = curpos + bytes;
printf ("%sCHUNK %s (%8ld)", tabstr(tab), ltos(chunk[0]), bytes);
if (curend > endpos) {
puts ("\nError: Premature End Of File within chunk");
return(0);
}
#if 0
printf("chunk: %lx\n",chunk[0]);
#endif
ok = 0;
switch(chunk[0]) {
case IFF_FILLER:
printf ("A filler chunk\n");
if (Modes & MODE_V2)
hexdump(fi, curpos, bytes, tab);
break;
case IFF_FORM:
case IFF_LIST:
case IFF_CAT:
case IFF_PROP:
fread(&data,1, 4,fi);
curpos += 4;
bytes -= 4;
printf ("TYPE %s\n", ltos(data));
iffdecode(fi, tab + 4, curend);
break;
default:
ok = 1;
break;
}
if (ok) {
puts ("");
if (Modes & MODE_V1)
decode_sub(fi, tab, chunk[0], bytes);
if (Modes & MODE_V2)
hexdump(fi, curpos, bytes, tab);
}
if (curend & 1) {
printf ("%s(Filler Byte)\n", tabstr(tab));
++curend;
}
fseek(fi, curend, 0);
}
}
decode_sub(fi, tab, name, bytes)
FILE *fi;
long tab,bytes,name;
{
int i, j;
tab += 4;
switch (name) {
case ILBM_ANHD:
cs((long)sizeof(U.anhd), bytes);
fread(&U.anhd,1, sizeof(U.anhd),fi);
printf ("%s op= %-4d\n", tabstr(tab), U.anhd.operation);
printf ("%s mask= %-2x\n", tabstr(tab), U.anhd.mask);
printf ("%s width= %-4d\n", tabstr(tab), U.anhd.w);
printf ("%sheight= %-4d\n", tabstr(tab), U.anhd.h);
printf ("%s x= %-4d\n", tabstr(tab), U.anhd.x);
printf ("%s y= %-4d\n", tabstr(tab), U.anhd.y);
printf ("%sabstim= %-4ld\n", tabstr(tab), U.anhd.abstime);
printf ("%sreltim= %-4ld\n", tabstr(tab), U.anhd.reltime);
printf ("%sintrlv= %-4d\n", tabstr(tab), U.anhd.interleave);
break;
case ILBM_BMHD:
cs((long)sizeof(U.bmhd), bytes);
fread(&U.bmhd,1, sizeof(U.bmhd),fi);
printf ("%s width= %-4d\n", tabstr(tab), U.bmhd.w);
printf ("%sheight= %-4d\n", tabstr(tab), U.bmhd.h);
printf ("%splanes= %-4d\n", tabstr(tab), U.bmhd.planes);
printf ("%s x= %-4d\n", tabstr(tab), U.bmhd.x);
printf ("%s y= %-4d\n", tabstr(tab), U.bmhd.y);
printf ("%s mask= x%-2x\n",tabstr(tab), U.bmhd.masking);
printf ("%s comp= x%-2x\n",tabstr(tab), U.bmhd.compression);
printf ("%stcolor= %-2d\n", tabstr(tab), U.bmhd.transparent_color);
printf ("%sxaspct= %-2d\n", tabstr(tab), U.bmhd.xaspect);
printf ("%syaspct= %-2d\n", tabstr(tab), U.bmhd.yaspect);
printf ("%s pagew= %-4d\n", tabstr(tab), U.bmhd.pagewidth);
printf ("%s pageh= %-4d\n", tabstr(tab), U.bmhd.pageheight);
break;
case ILBM_CMAP:
if (bytes % 3) {
puts ("Expected multiples of 3 bytes for colormap");
break;
}
if (bytes > 32*3) {
puts ("Color map is larger than 32 entries");
break;
}
fread(&U.cmap,1,(int)bytes,fi);
j = bytes/3;
for (i = 0; i < j; ++i) {
printf ("%scolor %2d %2x %2x %2x\n",
tabstr(tab), i, U.cmap[i][0], U.cmap[i][1], U.cmap[i][2]);
}
break;
case ILBM_GRAB:
case ILBM_DEST:
case ILBM_SPRT:
puts ("");
break;
case ILBM_CAMG:
fread(&U.camg,1, sizeof(U.camg),fi);
i = U.camg.vpmodes;
printf ("%sVP MODES = %8x (", tabstr(tab), i);
if (i & HIRES)
printf("HIRES ");
if (i & SPRITES)
printf("SPRITES ");
if (i & VP_HIDE)
printf("VP_HIDE ");
if (i & HAM)
printf ("HAM ");
if (i & DUALPF)
printf ("DUALPF ");
if (i & GENLOCK_AUDIO)
printf ("GENLOCK_AUDIO ");
if (i & EXTRA_HALFBRITE)
printf ("EXTRA_HALFBRITE ");
if (i & PFBA)
printf ("PFBA ");
if (i & LACE)
printf ("LACE ");
if (i & GENLOCK_VIDEO)
printf ("GENLOCK_VIDEO ");
puts (")");
break;
case ILBM_CRNG:
cs((long)sizeof(U.crng), bytes);
fread(&U.crng,1, sizeof(U.crng),fi);
printf ("%s count= %-4d\n", tabstr(tab), U.crng.count);
printf ("%s rate= %-4d\n", tabstr(tab), U.crng.rate);
printf ("%s flags= %-4d\n", tabstr(tab), U.crng.flags);
printf ("%s low= %-4d\n", tabstr(tab), U.crng.low);
printf ("%s high= %-4d\n", tabstr(tab), U.crng.high);
break;
case ILBM_BODY:
break;
}
}
hexdump(fi, curpos, bytes, tab)
FILE *fi;
long curpos,bytes,tab;
{
long pos;
UBYTE ch;
pos = 0;
fseek(fi, curpos, 0);
while (bytes) {
fread( &ch,1, 1,fi);
if ((pos & 15) == 0) {
printf("\n%s%5lx ", tabstr(tab+4), pos);
}
printf ("%2x ", ch);
++pos;
--bytes;
}
puts("");
}
cs(shouldbe, actual)
long shouldbe,actual;
{
if (shouldbe != actual)
printf ("Expected %ld bytes, got %ld\n", shouldbe, actual);
}
char *
tabstr(tab)
long tab;
{
static char space[128];
static int lasttab = 0;
static int init = 1;
if (init) {
for (init=1;init<128;init++) space[init] = ' ';
init = 0;
}
if (tab != lasttab) {
space[lasttab] = ' ';
space[lasttab = tab] = '\0';
}
return (space);
}
char *
ltos(data)
unsigned long data;
{
static char buf[5];
buf[0] = (data >> 24) & 0xFF;
buf[1] = (data >> 16) & 0xFF;
buf[2] = (data >> 8 ) & 0xFF;
buf[3] = data & 0xFF;
return(buf);
}